package com.joinway.framework.extension.utils;

import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public final class DateTimeUtils {

	private final static Logger log = LoggerFactory.getLogger(DateTimeUtils.class);
	
	public final static String[] DATE_PATTERN = new String[]{
		"yyyy-MM-dd HH:mm:ss"
		, "yyyy-MM-dd HH:mm:ss,SSS"
		, "yyyy/MM/dd HH:mm:ss"
		, "yyyy/MM/dd HH:mm"
		, "yyyyMMddHHmmss"
		, "yyyyMMddHHmm"
		, "yyyyMMdd HHmmss"
		, "yyyyMMdd HHmm"
		, "yyyy/MM/dd"
		, "yyyy-MM-dd"
		, "yyyyMMdd"
	};
	
	/**
	 * 把Unix格式的时间转换为java时间对象
	 * @param time Unix格式的时间
	 * @return java日期对象
	 */
	public static Date fromUnixFormat(String time){
		return fromUnixFormat(Integer.valueOf(time));
	}

	/**
	 * 把Unix格式的时间转换为java时间对象
	 * @param time Unix格式的时间
	 * @return java日期对象
	 */
	public static Date fromUnixFormat(int time){
		long t = time * 1000l;
		return new Date(t);
	}
	
	/**
	 * 把java时间对象转换为Unix格式时间
	 * @param date java时间对象
	 * @return Unix时间
	 */
	public static int toUnixFormat(Date date){
		return (int)(date.getTime() / 1000);
	}
	
	/**
	 * 把java时间对象转换为Unix格式时间
	 * @param date java时间对象
	 * @return Unix时间
	 */
	public static String toUnixStringFormat(Date date){
		return String.valueOf(toUnixFormat(date));
	}

	/**
	 * 把任意对象转换为时间对象
	 * 把对象转换成字符串后，再转换成日期对象。如果转换出错，则返回null
	 * @param obj 目标对象
	 * @param patterns 时间格式，格式参考<code>java.text.SimpleDateFormat</code>
	 * @see java.text.SimpleDateFormat
	 * @return 时间对象，转换出错返回null
	 */
	public static Date convertToDate(Object obj, String...patterns) {
		Date date = null;
		
		try{
			if(obj != null){
				date = DateUtils.parseDate(DataUtils.convertToString(obj), ArrayUtils.isEmpty(patterns) ? DATE_PATTERN : patterns);
			}
		}catch(Exception e){
			log.warn("failed to convert {} to date", obj);
		}
		
		return date;
	}

	/**
	 * 获得今天日期
	 * @return yyyyMMdd格式字符串，如20160705
	 */
	public static String getToday(){
		return DateFormatUtils.format(new Date(), "yyyyMMdd");
	}

	/**
	 * 设置当前时间偏移量
	 * @param date 基准日期
	 * @param yearShift 年份偏移量
	 * @param monthShift 月份偏移量
	 * @param dayShift 日期偏移量
	 * @param hourShift 小时偏移量
	 * @param minShift 分组偏移量
	 * @param secondShift 秒偏移量
	 * @param msecondShift 毫秒偏移量
	 * @return
	 */
	public static Date getDate(Date date, int yearShift, int monthShift, int dayShift, int hourShift, int minShift, int secondShift, int msecondShift){
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.YEAR, yearShift);
		c.add(Calendar.MONTH, monthShift);
		c.add(Calendar.DATE, dayShift);
		c.add(Calendar.HOUR, hourShift);
		c.add(Calendar.MINUTE, minShift);
		c.add(Calendar.SECOND, secondShift);
		c.add(Calendar.MILLISECOND, msecondShift);
		
		return c.getTime();
	}
	
	private DateTimeUtils(){}
	
}
